package cn.edu.wynu.apis.collections.generics;

import java.util.ArrayList;

public class WhyGenerics {
    public static void main(String[] args) {
        //1. 为什么要有泛型
        ArrayList list = new ArrayList();
        // 因为ArrayList内部是使用 Object数组来实现的,所以可以存储任意类型的对象
        list.add("hello");
        list.add(100);
        list.add(true);
        System.out.println(list);
        // 在java里面,所有的类都是Object的子类,所以可以存储任意类型的对象
        // 但是也带来了问题:
        // 1.1 通常情况下,我们希望ArrayList只能存储一种类型的对象,可能是字符串;虽然我们知道存进去的一定是字符串(需要手动强制类型转换)
        // 但是还是要使用类型强制转换, 如果不使用强制类型转换就会报错 String o = list.get(0);
        // 1.2 Integer s = (Integer)list.get(0); 如果类型转换错误,虽然编译不会出错,但是运行时就会产生异常(类型不安全)

        // 2. 为了避免上面的两个问题,首先想到的就是为每一种类型创建一个ArrayList类,内部使用对应的类型数组实现,
        // 比如 StringArrayList, IntegerArrayList,但是这样势必会导致类爆炸,
        // 所以泛型应运而生, 所谓泛型就是在创建数据结构的时候,就指定这个数据结构中只能存储什么类型的数据,具体如下案例:
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(1);
        // integers.add("abc"); // 编译错误,因为只能存储整数类型; 这里解决了之前提到的类型安全问题
        Integer integer = integers.get(0); // 不需要强制类型转换,解决了Object数组强制类型转换的问题,
    }
}
